class RemoveKDigits {
  /**
   * 删除整数的k个数字，获得删除后的最小值
   * @param {*} num  原整数
   * @param {*} k 删除数量
   */
  removeKDigits (num, k) {
    for (let i = 0; i < k; i++) {
      let hasCut = false;
      // 从左向右遍历，找到比自己右侧数字大的数字并删除
      for (let j = 0; j < num.length - 1; j++) {
        if (num.charAt(j) > num.charAt(j + 1)) {
          num = num.substring(0, j) + num.substring(j + 1, num.length);
          hasCut = true;
          break;
        }
      }
      //如果没有找到要删除的数字，则删除最后一个数字
      if (!hasCut) {
        num = num.substring(0, num.length - 1);
      }
    }
    //清除整数左侧的数字0
    let start = 0;
    for (let j = 0; j < num.length - 1; j++) {
      if (num.charAt(j) != '0') {
        break
      }
      start++;
    }
    num = num.substring(start, num.length);
    //如果整数的所有数字都被删除了，直接返回0
    if (num.length == 0) return '0';
    return num;
  }
  removeKDigitsV2 (num, k) {
    //新整数的最终长度 = 原整数长度 - k
    let newLength = num.length - k;
    //创建一个栈，用于接收所有的数字
    let stack = new char();
    let top = 0;
    for (let i = 0; i < num.length; i++) {
      // 遍历当前数字
      let c = num.charAt(i);
      // 当栈顶的数字遍历到当前数字，栈顶数字出栈（相当于删除数字）
      while (top > 0 && stack[top - 1] > c && k > 0) {
        top -= 1;
        k -= 1;
      }
      //如果遇到数字0，且栈为空，0不入栈
      if ('0' == c && top == 0) {
        newLength--;
        if (newLength <= 0) {
          return "0";
        }
        continue;
      }
      // 遍历到的当前数字入栈
      stack[top++] = c;
    }
    // 用栈构建新的整数字符串
    return newLength <= 0 ? "0" : new String(stack, 0, newLength);
  }
}
console.log(new RemoveKDigits().removeKDigits("1593212", 3));
console.log(new RemoveKDigits().removeKDigits("30200", 1));
console.log(new RemoveKDigits().removeKDigits("10", 2));
console.log(new RemoveKDigits().removeKDigits("541270936", 3));
console.log(new RemoveKDigits().removeKDigits("1593212", 4));
console.log(new RemoveKDigits().removeKDigits("1000020000000010", 2));
